"""
交互式提示词工程模块
实现支持交互式反馈和历史记录管理的提示词工程功能
"""

import json
import datetime
from typing import Dict, List, Any, Optional
from src.research_core.prompt_eng_state import PromptEngineeringState


class InteractivePromptEngineering:
    """
    交互式提示词工程类
    提供交互式反馈和历史记录管理功能
    """
    
    def __init__(self):
        self.history_manager = PromptHistoryManager()
        self.feedback_collector = InteractiveFeedbackCollector()
    
    def save_prompt_version(self, state: PromptEngineeringState, version_name: Optional[str] = None) -> Dict[str, Any]:
        """
        保存提示词版本到历史记录中
        
        Args:
            state: 当前提示词工程状态
            version_name: 版本名称，如果未提供则自动生成
            
        Returns:
            更新后的状态字典
        """
        if not version_name:
            timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
            version_name = f"version_{timestamp}"
        
        # 获取当前提示词
        current_prompt = state.get('current_prompt', '')
        if not current_prompt:
            return {}
        
        # 更新提示词版本历史
        prompt_versions = state.get('prompt_versions', {}).copy()
        prompt_versions[version_name] = current_prompt
        
        # 保存到历史管理器
        self.history_manager.add_version(version_name, current_prompt)
        
        return {
            "prompt_versions": prompt_versions
        }
    
    def get_prompt_versions(self, state: PromptEngineeringState) -> Dict[str, Any]:
        """
        获取所有提示词版本
        
        Args:
            state: 当前提示词工程状态
            
        Returns:
            包含所有提示词版本的字典
        """
        return {
            "prompt_versions": state.get('prompt_versions', {})
        }
    
    def compare_prompt_versions(self, state: PromptEngineeringState, 
                              version_a: str, version_b: str) -> Dict[str, Any]:
        """
        比较两个提示词版本
        
        Args:
            state: 当前提示词工程状态
            version_a: 版本A的名称
            version_b: 版本B的名称
            
        Returns:
            包含比较结果的字典
        """
        prompt_versions = state.get('prompt_versions', {})
        prompt_a = prompt_versions.get(version_a, '')
        prompt_b = prompt_versions.get(version_b, '')
        
        comparison = {
            "version_a": {
                "name": version_a,
                "content": prompt_a,
                "length": len(prompt_a)
            },
            "version_b": {
                "name": version_b,
                "content": prompt_b,
                "length": len(prompt_b)
            },
            "differences": self._calculate_differences(prompt_a, prompt_b)
        }
        
        return {
            "comparison_result": comparison
        }
    
    def _calculate_differences(self, prompt_a: str, prompt_b: str) -> Dict[str, Any]:
        """
        计算两个提示词之间的差异
        
        Args:
            prompt_a: 提示词A
            prompt_b: 提示词B
            
        Returns:
            包含差异信息的字典
        """
        # 简化的差异计算
        return {
            "length_difference": len(prompt_a) - len(prompt_b),
            "has_content_difference": prompt_a != prompt_b
        }
    
    def collect_interactive_feedback(self, state: PromptEngineeringState) -> Dict[str, Any]:
        """
        收集交互式反馈
        
        Args:
            state: 当前提示词工程状态
            
        Returns:
            包含反馈收集结果的字典
        """
        # 这里可以实现实际的交互式反馈收集逻辑
        # 目前返回一个示例结构
        return {
            "feedback_collection_status": "ready",
            "supported_feedback_types": ["clarity", "structure", "content", "effectiveness"]
        }


class PromptHistoryManager:
    """
    提示词历史记录管理器
    管理提示词版本历史和变更记录
    """
    
    def __init__(self):
        self.versions = {}
        self.changes = []
    
    def add_version(self, version_name: str, prompt_content: str):
        """
        添加提示词版本
        
        Args:
            version_name: 版本名称
            prompt_content: 提示词内容
        """
        self.versions[version_name] = {
            "content": prompt_content,
            "timestamp": datetime.datetime.now().isoformat(),
            "version_name": version_name
        }
        
        # 记录变更历史
        self.changes.append({
            "action": "add_version",
            "version_name": version_name,
            "timestamp": datetime.datetime.now().isoformat()
        })
    
    def get_version(self, version_name: str) -> Optional[Dict[str, Any]]:
        """
        获取指定版本的提示词
        
        Args:
            version_name: 版本名称
            
        Returns:
            版本信息字典，如果未找到则返回None
        """
        return self.versions.get(version_name)
    
    def list_versions(self) -> List[str]:
        """
        列出所有版本名称
        
        Returns:
            版本名称列表
        """
        return list(self.versions.keys())
    
    def delete_version(self, version_name: str) -> bool:
        """
        删除指定版本
        
        Args:
            version_name: 版本名称
            
        Returns:
            删除成功返回True，否则返回False
        """
        if version_name in self.versions:
            del self.versions[version_name]
            self.changes.append({
                "action": "delete_version",
                "version_name": version_name,
                "timestamp": datetime.datetime.now().isoformat()
            })
            return True
        return False


class InteractiveFeedbackCollector:
    """
    交互式反馈收集器
    收集和处理用户对提示词的反馈
    """
    
    def __init__(self):
        self.feedback_templates = {
            "clarity": "请评价该提示词的清晰度：[1-5分]，并说明原因",
            "structure": "请评价该提示词的结构合理性：[1-5分]，并提出改进建议",
            "content": "请评价该提示词的内容完整性：[1-5分]，是否有遗漏的重要信息？",
            "effectiveness": "请评价该提示词的实际效果：[1-5分]，是否达到了预期目标？"
        }
    
    def get_feedback_template(self, feedback_type: str) -> Optional[str]:
        """
        获取指定类型的反馈模板
        
        Args:
            feedback_type: 反馈类型
            
        Returns:
            反馈模板字符串，如果类型不存在则返回None
        """
        return self.feedback_templates.get(feedback_type)
    
    def collect_feedback(self, feedback_type: str, custom_prompt: Optional[str] = None) -> Dict[str, Any]:
        """
        收集反馈
        
        Args:
            feedback_type: 反馈类型
            custom_prompt: 自定义提示语
            
        Returns:
            包含反馈收集信息的字典
        """
        prompt = custom_prompt or self.feedback_templates.get(feedback_type, "请提供您的反馈意见：")
        
        return {
            "feedback_type": feedback_type,
            "prompt": prompt,
            "status": "ready_for_input"
        }
    
    def process_feedback(self, feedback_data: Dict[str, Any]) -> Dict[str, Any]:
        """
        处理收集到的反馈
        
        Args:
            feedback_data: 反馈数据
            
        Returns:
            处理结果
        """
        processed_feedback = {
            "feedback_entry": {
                "type": feedback_data.get("type", "general"),
                "content": feedback_data.get("content", ""),
                "rating": feedback_data.get("rating"),
                "timestamp": datetime.datetime.now().isoformat()
            },
            "processing_status": "completed"
        }
        
        return processed_feedback


def create_interactive_prompt_engineering_workflow():
    """
    创建交互式提示词工程工作流
    在现有工作流基础上增加交互式功能
    """
    # 这个函数可以用于创建一个增强的工作流
    # 目前只是一个占位符，表示未来可以扩展的功能
    pass


# 导出类和函数
__all__ = [
    'InteractivePromptEngineering',
    'PromptHistoryManager',
    'InteractiveFeedbackCollector',
    'create_interactive_prompt_engineering_workflow'
]